#include<sys/types.h>
#include<sys/wait.h>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<unistd.h>
//void fun() {
//  printf("fun fun!\n");
//  return 1;
//
//
//}
//
//

//int main()
//{
//  pid_t id=fork();
//  int a=5;
//  if(id==0)
//  {
//    //child
//    while(a)
//    {
//      printf("child=%d child is running: sum is: %d\n",getpid(),a);
//      a--;
//    }
//    exit(0);
//  }
//
//    sleep(3);
//    printf("fatherw wait begin!\n");
//    // pid_t ret=wait(NULL);
//   //pid_t  ret=waitpid(id,NULL,0);//等待一个指定的子进程
//   //pid_t  ret=waitpid(-1,NULL,0);//等待任意一个子进程等价于wait
//   int status=0;
//   pid_t ret=waitpid(id,&status, 0);//等待一个指定的子进程
//
//
//    if(ret>0){  
//     printf("fatherw wait %d\n ,success,status%d\n",ret,status);
// }
//    else if{
//
//  printf("father wait failed!\n");
//    }
//
//      
// sleep(10);
// return 0;
//}
//
//
int main()
{
  if(fork()==0){
  execl("/usr/bin/ls","ls","-a","-l",NULL);
 int a=10;
    exit(0);
  }
 //parent
 waitpid(-1,NULL,0);
 printf("wait success!\n");
 // printf("hello world!\n");
 // pid_t id=fork();
 // if(id==0){
 //   printf("i am a process!,pid:%d\n",getpid());
 //   sleep(3);
 // //execl 程序替换
 // //后面的代码不执行了
 // //加载进特定的程序的上下文中
 ////只要进程的程序替换成功，就不会执行后面的代码，意味着execl函数不需要返回值检测
 ////只要execl返回了，就一定是调用失败了
 // execl("/usr/bin/ls", "-l","NULL");
 // exit(1);
 // printf("xxxx");
 // printf("xxxx");
 // printf("xxxx");
 // printf("xxxx");
 // printf("xxxx");
 // exit(0);
 // 
 // }
 // //进程程序会更改代码区，发生写实拷贝
 // //
 // while(1){
 //   printf("i am a father!\n");
 //   sleep(1);
 // }
 // //parent
 // waitpid(id,NULL,0);
 // printf("wait succes!\n");
}




//int mian()
//{
//      printf("I am a child process!, pid: %d, ppid: %d\n", getpid(), getppid());
//      //exit(10);
//      pid_t id = fork();
//      if(id == 0){
//          //child
//          int cnt = 10;
//          while(cnt){
//              printf("child[%d] is running: cnt is : %d\n", getpid(), cnt);
//              cnt--;
//              sleep(1);
//          }
//          //int a = 10;
//          //a /= 0;
//         exit(1);
//     }
//  
//      int status = 0;
//      while(1){
//          pid_t ret = waitpid(id, &status, WNOHANG); 
//          if(ret == 0){
//              //子进程没有退出，但是waitpid等待是成功的，需要父进程重复进行等待
//              printf("Do father things!\n");
//          }
//          else if(ret > 0){
//              //子进程退出了，waitpid也成功了，获取到了对应的结果
//              printf("fahter wait: %d, success, status exit code: %d, status exit signal: %d\n", ret, (status>>8)&0xFF, status&0x7F);
//              break;
//          }
//          else{ //ret < 0
//              //等待失败
//              perror("waitpid");
//              break;
//          }
//          sleep(1);
//      }
//    
//     sleep(5);
//     printf("father wait begin!\n");
//      pid_t ret = wait(NULL);
//  
//     pid_t ret = waitpid(id, NULL, 0); //等待指定一个进程
//     pid_t ret = waitpid(-1, NULL, 0);   //等待任意一个子进程, 等价于wait!
//     
//     int status = 0;
//     pid_t ret = waitpid(id, &status, 0/*0: 默认行为，阻塞等待, WNOHANG: 设置等待方式为非阻塞*/);   //等待任意一个子进程, 等价于wait!
//     if(ret > 0){
//         if(WIFEXITED(status)){ //没有收到任何退出信号的
//             //正常结束的,获取对应的退出码
//             printf("exit code: %d\n", WEXITSTATUS(status));
//      }
//        else{
//            printf("error, get a signal!\n");
//         }
//     }
//     if(ret > 0){
//         printf("fahter wait: %d, success, status exit code: %d, status exit signal: %d\n", ret, (status>>8)&0xFF, status&0x7F);
//     }
//     else{
//         printf("father wait failed!\n");
//     }
//  
//     sleep(10);
//  
//     //parent
//}
//
//
////int main()
////{
////  
////  printf("hello world");
////  sleep(1);
//// exit(EXIT_SUCCESS);
//////  int a=1;
//////  fun();
//////  exit(1);
//////  for(int i=0;i<140;i++)
//////  {
//////    printf("%d i :%s\n",i,strerror(i));
//////  }
//////  printf("hello world!\n");
//////
////  return 111;
////}
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
////
//int main()
////{
 // pid_t id=fork();
 // if(id==0){
 //   //child
 //   int sum=3;
 //   while(sum){
 //     printf("child[%d],is running:sum is:%d\n",getpid(),sum);
 //     sum--;
 //     sleep(1);
 //   }
 //   exit(0);
 // }
 // //非阻塞等待 WNOHANG
 // //子进程没有退出
 // //子进程退出
 // int status=0;
 // while(1){

 // pid_t ret=waitpid(id,&status,WNOHANG);
 // if(ret==0){
 //   //子进程没有退出，但是waitpid等待是成功的，需要父进程重复等待
 //   printf("Do father thing!\n"); 
 // }
 // else if(ret>0){
 //   //子进程退出了，waitpid也成功了，获取到对应的结果
 //   
 //   printf("father wait:%d,success,status exit code:%d\n,status exit signal:%d\n",ret,(status>>8)&0xFF,(status&0x7F));
 //break;
 // }
 // else{
 //   //等待失败
 //   printf("error!\n");
 //   break;
 // }
 //   sleep(1);
 // }

 // //printf("father wait begin!\n");
 // //int status=0;
 // ////pid_t ret=wait(NULL);
 // ////pid_t ret=waitpid(id,NULL,0);//等待指定一个进程
 // ////pid_t ret=waitpid(-1,NULL,0);//等待任意一个子进程，等价于wait
 // //
 // //pid_t ret=waitpid(id,&status,0);//0代表默认行为，阻塞等待(其实是进程PCB被放入等待队列，并将进程的状态改为S) 可以WNOHANG:非阻塞等待
 // //if(ret>0){
 // //  if(WIFEXITED(status)){//没收到任何退出信号
 // //    //正常结束，获取对应的退出码
 // //    printf("exit code:%d\n",WEXITSTATUS(status));
 // //  }
 // //  else{
 // //    printf("error a singal!\n");
 // //  }
 // //}
 // //if(ret>0){
 // //  printf("father wait:%d,success,status exit code:%d\n,status exit signal:%d\n",ret,(status>>8)&0xFF,(status&0x7F));

 // //}
 // //else{
 // //  printf("father wait faild!\n");
 // //}
 // //  

 //   
 //   
 //} 

